{***************************************************************
    SpyGestion  Copyright (C) 2008 Christophe KOALI <nature2gas@gmail.com>
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
****************************************************************}
unit L30_modClassesWithDB;

interface

uses
     modBaseType,
     SysUtils,

     modUnitAndDefInfos,
     modGIDtoSTR,

     modStatsPlayers,

     modGalaxiePlanetes,
     modFlotteVaisseauxChoix,

     modClasses,
     L01_modPlayerUtils,
     L05_modFlotteTracking,
     L10_modClassesAlerteAtt,
     L20_modClassesConstruction,

     
     Classes,
     modRapport;

     
type
    TPlayerWithDB = class(TPlayerGestionConstruct)
    private
        // simple copie de pointeur
        // on ne créé par ces éléments
        FUnitsInfos: TCollectionUnitInfos;
        FGidToStr  : TCollectionGIDtoSTR;

        // les stats
        FStatsPlayer         : TCollectionPlayerStats;
        FStatsPlayerFlottes  : TCollectionPlayerStats;
        FStatsPlayerRecherche: TCollectionPlayerStats;

        // définit si les stats sont partagées, ou non
        // cela ne sert pas pour la classe, mais sert pour le programme
        // qui s'occupe du joueur, si elles sont partagée, alors il ne libérera pas
        FStatsShared         : boolean;


        // la base de données des rapports peut également être partagé
        // mais un problème se pose, cette base de données peut changer d'une galaxie à l'autre



        // les rapports étant souvent analysés, on utilise une variable fixe pour la classe
        // ATTENTION: Cela implique d'utiliser les sections critiques, donc ne pas les oublier
        FRapportLines : TStringList;
        FRapportParser: TRapportInfos;


        procedure SetUnitsInfos(Valeur: TCollectionUnitInfos);
        procedure SetGidToStr(Valeur: TCollectionGIDtoSTR);

    public
        // simple copie de pointeur
        property UnitsInfos : TCollectionUnitInfos read FUnitsInfos write SetUnitsInfos;
        property GidToStr   : TCollectionGIDtoSTR  read FGidToStr   write SetGidToStr;


        property LastRapportAnalyse: TRapportInfos read FRapportParser;

        // les stats peuvent être commune à plusieurs comptes (surtout lors de multi)
        // les stats sont alors partagé comme UnitsInfos et GidToStr
        // ceux sont seulement des copies de pointeurs
        property StatsPlayer          : TCollectionPlayerStats read FStatsPlayer          write FStatsPlayer;
        property StatsPlayerFlottes   : TCollectionPlayerStats read FStatsPlayerFlottes   write FStatsPlayerFlottes;
        property StatsPlayerRecherche : TCollectionPlayerStats read FStatsPlayerRecherche write FStatsPlayerRecherche;
        property StatsShared          : boolean                read FStatsShared          write FStatsShared;

        procedure ClearStats;


        function AnalyseRapportEsp(sRapport: string): TRapportHead;


        constructor Create;
        destructor Destroy; override;

        procedure ShowInternal; override;
    end;

    
implementation

uses gnugettext;

procedure TPlayerWithDB.ShowInternal;
begin
        inherited ShowInternal;
        
        DoDebug('@@@@@ Base de données @@@@@');

        DoDebugInt('StatsShared', FStatsShared);

end;

procedure TPlayerWithDB.SetUnitsInfos(Valeur: TCollectionUnitInfos);
begin
    FUnitsInfos  := Valeur;
    FRapportParser.UnitsInfos := Valeur;
end;
procedure TPlayerWithDB.SetGidToStr(Valeur: TCollectionGIDtoSTR);
begin
    FGidToStr    := Valeur;
    FRapportParser.GidToStr := Valeur;
end;


function TPlayerWithDB.AnalyseRapportEsp(sRapport: string): TRapportHead;
begin

    Lock;

    // définit le résultat comme une erreur
    Result.PlaneteLocation.Galaxie       := -1;
    Result.PlaneteLocation.SystemSolaire := -1;
    Result.PlaneteLocation.Position      := -1;

    FRapportParser.Clean;

    FRapportLines.Clear;

    // s'occupe de découper les lignes pour les placer dans la liste
    FRapportLines.Text := sRapport;


    if Conf.UniversDefenseRecyclable then begin
       FRapportParser.DefenseDansLeChampDeRuinePourcent := Conf.UniversDefenseRecyclPourcent;

    end else begin
       FRapportParser.DefenseDansLeChampDeRuinePourcent := 0;
    end;


    // Analyse le rapport
    if FRapportParser.ParseRapport(FRapportLines) <= 0 then begin
       // Rapport invalide
       FRapportParser.Clean;
       FRapportLines.Clear;
       Unlock;

       {$IFDEF DEBUG}
          DoDebug(_('Rapport invalide'));
       {$ENDIF}
       exit;
    end;


    // définit le résultat
    Result := FRapportParser.RapportInfos;




    FRapportLines.Clear;

    // nettoie le parseur
    // update: NON, les données du parseur sont utilisées
    // pour savoir si c'est peut-être une lune à partir des batiments
    // et/ou du nom, et pour définir si on met le flag trop peu dev

    Unlock;

end;

procedure TPlayerWithDB.ClearStats;
begin
    StatsPlayer.Clear;
    StatsPlayerFlottes.Clear;
    StatsPlayerRecherche.Clear;
end;

constructor TPlayerWithDB.Create;
begin
    inherited Create;

    FUnitsInfos := nil;
    FGidToStr   := nil;


        FStatsPlayer          := nil;
        FStatsPlayerFlottes   := nil;
        FStatsPlayerRecherche := nil;
        FStatsShared          := true;

        FRapportLines := TStringList.Create;
        FRapportParser:= TRapportInfos.Create(nil);


end;

destructor TPlayerWithDB.Destroy;
begin

    FRapportLines.Free;

    inherited Destroy;
end;


end.
